
#ifndef __CE_GFX_IPROGRAMPARAMETER_H__
#define __CE_GFX_IPROGRAMPARAMETER_H__

#include <iobject.h>
#include <gfx/enum.h>
#include <gfx/itexture.h>
#include <math/color.h>
#include <math/matrix.h>
#include <math/vector.h>

/**
 * \addtogroup graphics
 * @{
 */

/**
 * @brief Interface for controling the value of a varialbe within a shader.
 */
struct iProgramParameter : public iObject
{
  virtual void Bind (int x) = 0;
  virtual void Bind (int x, int y) = 0;
  virtual void Bind (int x, int y, int z) = 0;
  virtual void Bind (int x, int y, int z, int w) = 0;

  virtual void Bind (float x) = 0;
  virtual void Bind (float x, float y) = 0;
  virtual void Bind (float x, float y, float z) = 0;
  virtual void Bind (float x, float y, float z, float w) = 0;

  virtual void Bind (const ceVector2f& v) = 0;
  virtual void Bind (const ceVector3f& v) = 0;
  virtual void Bind (const ceVector4f& v) = 0;
  virtual void Bind (const ceColor4f& c) = 0;

  virtual void Bind (unsigned count, const float* v) = 0;
  virtual void Bind (unsigned count, const ceVector2f* v) = 0;
  virtual void Bind (unsigned count, const ceVector3f* v) = 0;
  virtual void Bind (unsigned count, const ceVector4f* v) = 0;
  virtual void Bind (unsigned count, const ceMatrix4f* m) = 0;

  virtual void Bind (const ceMatrix4f& m) = 0;

  virtual void Bind (int size, int stride, unsigned offset, ceDataType type = DT_Float) = 0;
  virtual void Bind (int size, int stride, const void* data, ceDataType type = DT_Float) = 0;
  virtual void Bind (int stride, const ceVector2f* vptr) = 0;
  virtual void Bind (int stride, const ceVector3f* vptr) = 0;
  virtual void Bind (int stride, const ceVector4f* vptr) = 0;

  virtual void Bind(ceTextureStage state, const iTexture2D* texture) = 0;

  virtual void Enable () = 0;
  virtual void Disable () = 0;


};


/**
 * @}
 */

#endif /* ! __CE_GFX_IPROGRAMPARAMETER_H__ */

